package com.example.gitstudy.code;

import cn.hutool.captcha.*;
import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.captcha.generator.RandomGenerator;
import cn.hutool.core.lang.Console;
import cn.hutool.core.thread.ConcurrencyTester;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author hwj
 * @date 2023/1/29 14:17
 * @描述；hutool生成图片验证码
 */
@RestController
@RequestMapping("code")
public class CodeDemo {


    /**
     * 不同类型的验证码
     * @param response
     * @throws IOException
     */
    @GetMapping("createCode")
    public void createCaptcha(HttpServletResponse response) throws IOException {
        // 1. 普通 定义图形验证码的长和宽
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);


        // 2. 圆形干扰验证码： 定义图形验证码的长、宽、验证码字符数、干扰元素个数
        CircleCaptcha captcha = CaptchaUtil.createCircleCaptcha(200, 100, 4, 30);


        // 3. 扭曲干扰验证码: 定义图形验证码的长、宽、验证码字符数、干扰线宽度
        ShearCaptcha captcha1 = CaptchaUtil.createShearCaptcha(200, 100, 4, 4);

        // 4. GIF验证码： 定义GIF验证码的长、宽
        GifCaptcha captcha2 = CaptchaUtil.createGifCaptcha(200, 100);


        // 图形验证码写出，可以写出到文件，也可以写出到流
        lineCaptcha.write(response.getOutputStream());

        // 关闭流
        response.getOutputStream().close();
    }

    /**
     *  纯数字的验证码：
     * @param response
     * @throws IOException
     */
    @GetMapping
    public void createCaptcha1(HttpServletResponse response) throws IOException {
        // 随机4位数字，可重复
        RandomGenerator randomGenerator = new RandomGenerator("0123456789", 4);
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        lineCaptcha.setGenerator(randomGenerator);
        // 重新生成code
        lineCaptcha.createCode();
        lineCaptcha.write(response.getOutputStream());
        // 关闭流
        response.getOutputStream().close();
    }

    /**
     * 四则运算验证码：
     * @param response
     * @throws IOException
     */
    @GetMapping("createCode2")
    public void createCaptcha2(HttpServletResponse response) throws IOException {
        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
        // 自定义验证码内容为四则运算方式
        lineCaptcha.setGenerator(new MathGenerator());
        // 重新生成code
        lineCaptcha.createCode();
        lineCaptcha.write(response.getOutputStream());
        System.out.println(lineCaptcha.getCode());
        // 关闭流
        response.getOutputStream().close();
    }



//    public static void main(String[] args) {
//        // 定义图形验证码的长和宽
//        LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100);
//        // 图形验证码写出到指定文件
//        lineCaptcha.write("F:/test/captcha.png");
//
//        /**
//         * getCode  获取验证码
//         * verify  检验是否一样  正确 true 错误 false
//         */
//        System.out.println(lineCaptcha.getCode());
//        System.out.println(lineCaptcha.verify(lineCaptcha.getCode()));
//
//    }

    public static void main(String[] args) {
        ConcurrencyTester tester = ThreadUtil.concurrencyTest(2, () -> {
            // 测试的逻辑内容
            long delay = RandomUtil.randomLong(2, 5);
            ThreadUtil.sleep(delay);
            Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), delay);
        });

// 获取总的执行时间，单位毫秒
        Console.log(tester.getInterval());
    }
}
